package thread;

public class ThreadDemo15 {
    //t线程把计算结果放在rs里面
    private static long rs = 0;
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() ->{
            long tmp = 0;
            for(long i = 1;i <= 50_00_000_000L;i++) {
                tmp +=i;
            }
            rs += tmp;
        });
        Thread t2 = new Thread(() ->{
//          t.join(); 把join加到开头,就是t2等t1执行完之后再继续执行
            long tep = 0;
            for(long i =  50_00_000_001L;i <= 10_000_000_000L;i++) {
                tep +=i;
            }
            rs += tep;
        });
        //把运算分成俩部分算
        t.start();
        t2.start();
        long beg = System.currentTimeMillis();
        //如果主线程直接打印rs结果是无法预测的
        //由于线程之间的执行顺序是不确定的,主线程打印的rs肯是没有开始计算的初值0
        //也可能是计算过程中的中间结果,也肯是t线程计算完之后的最终结果
//            //但是不晓得t运行多久
//            Thread.sleep(1000);
        //使用join就会严格按照t线程执行结束作为等待的结果
        //什么时候t运行完毕,什么时候join停止等待
        t.join();
//        t2.start();//先启动第一个线程,等待第一个线程结束,再启动第二个线程,又变成穿行执行了
        t2.join();
        //主线程通过等待俩线程结束才能打印结果和时间
        //确保join之后的结果一定是t线程执行完毕后的结果
        long end = System.currentTimeMillis();
        System.out.println("rs= " + rs);
        System.out.println("time=" + (end - beg) + "ms");
        //俩个线程算出来的时间不是单纯时间除二,多个线程可以提高速度
        //因为线程调度
    }
}
